/*
 * Copyright 2019, gRPC Authors All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import Foundation
import GRPC
import HelloWorldModel
import NIO
import Logging

// Quieten the logs.
LoggingSystem.bootstrap {
  var handler = StreamLogHandler.standardOutput(label: $0)
  handler.logLevel = .critical
  return handler
}

let numberOfThreads = ProcessInfo.processInfo.environment["GRPC_SERVER_CPUS"].flatMap(Int.init) ?? 1
let group = MultiThreadedEventLoopGroup(numberOfThreads: numberOfThreads)
defer {
  try! group.syncShutdownGracefully()
}

// Start the server and print its address once it has started.
let server = Server.insecure(group: group)
  .withServiceProviders([GreeterProvider()])
  .bind(host: "0.0.0.0", port: 50051)

server.map {
  $0.channel.localAddress
}.whenSuccess { address in
  print("server started on port \(address!.port!)")
}

// Wait on the server's `onClose` future to stop the program from exiting.
_ = try server.flatMap {
  $0.onClose
}.wait()
